/*************************
*** File List.h
**************************/

#ifndef __LIST_UTIL__H__
#define __LIST_UTIL__H__
#include <stdio.h>
#include <stdlib.h>

typedef struct TSNode_S
{
    void* TSData;
    struct TSNode_S* pstNext;
}TSNode_S;

typedef struct TSList_S
{
    TSNode_S* pstFirstNode;
    TSNode_S* pstLastNode;
    int nNodeCount;
    int (*TSEqual)(void * a, void * b);
    void (*TSFreeNode)(void* pstTSData);
}TSList_S;

typedef struct TSListIterator_S
{
    TSNode_S * p;
    int count;
    int allSize;
}TSListIterator_S;

//创建链表
TSList_S *TSCreateList();

//创建链表，带有相等参数，用于查找
//TSList_S * createSearchList(int(*equal)(void * a, void * b));

//释放链表
void TSFreeList(TSList_S* pstList);

//插入在尾部
void TSListInsertDataTail(TSList_S* pstTSList, void* pstTSData);

//插入在首部
void TSListInsertDataHead(TSList_S* pstTSList, void* pstTSData);

//插入
void TSListInsertData(TSList_S* pstTSList, void* pstTSData, int nIndex);

//删除在尾部
void* TSListRemoveDataTail(TSList_S* pstTSList);

//删除在首部
void* TSListRemoveDataHead(TSList_S* pstTSList);


//删除
void* TSListRemoveData(TSList_S* pstTSList, int nIndex);

//删除对象,返回是否删除成功
//int ListRemoveDataObject(TSList_S* const list, void * data);

//长度
int TSListGetSize(TSList_S* pstTSList);

//打印
void TSListPrint(TSList_S* pstTSList, void(*TSDataPrint)(void *TSData));

//取得数据
void* TSListGetData(TSList_S* pstTSList, int nIndex);

//取得第一个数据
void* TSListGetDataHead(TSList_S* pstTSList);

//取得最后一个数据
void* TSListGetDataTail(TSList_S* pstTSList);

//查找某个数据的位置,如果equal方法为空，比较地址，否则调用equal方法
//如果不存在返回-1，如果存在，返回出现的第一个位置
//int ListFindDataIndex(const TSList_S * const list, void * data);

//创建遍历器
TSListIterator_S* TSCreateListIterator(TSList_S* pstTSList);

//释放遍历器
void TSFreeListIterator(TSListIterator_S* pstIterator);

//遍历器是否有下一个元素
int TSListIteratorHasNext(TSListIterator_S* pstIterator);

//返回遍历器的下一个元素
void * TSListIteratorNext(TSListIterator_S* pstIterator);

#endif

